////////////////////////////////////////////////////////////////////////////////
//
//  FLEX USER GROUP HOKURIKU
//  Copyright 2009 Flex User Group Hokuriku
//  All Rights Reserved.
// 
//  NOTICE: Flex User Group Hokuriku permits you to use, 
//  modify, and distribute this file 
//  in accordance with the terms of the license agreement accompanying it.
//
////////////////////////////////////////////////////////////////////////////////
package net.fxug.hokuriku.chocolat.model
{
    import flash.net.InterfaceAddress;
    import flash.net.NetworkInfo;
    import flash.net.NetworkInterface;

    import mx.logging.ILogger;

    import net.fxug.hokuriku.chocolat.errors.NetworkInterfaceError;
    import net.fxug.hokuriku.chocolat.utils.LoggingUtil;

    /**
     * ネットワークインターフェイス情報操作クラス
     * TODO インスタンス生成が不要になったのでリファクタリング。
     * @author mac
     */
    public class NetworkInterfaceManager
    {
        /** ロガー */
        private static var logger:ILogger = LoggingUtil.getLogger(NetworkInterfaceManager);
        private var networkDataList:Array;

        /**
         * コンストラクタ
         */
        public function NetworkInterfaceManager()
        {
            this.networkDataList = new Array;
        }

        /**
         * ネットワークインターフェイスのデータ一覧を取得する
         *
         * @memo Vectorクラスを使っていたけどFlex的にViewで使いにくそうなので断念。dataProviderとかでVectorが簡単に使えるなら要再考
         *       ネストが深いのはNetworkInfoの実装のせいにしておこう･･･
         *
         * @return Array
         */
        public function getNetworkInterfaceDataList():Array
        {
            // 値を初期化
            this.networkDataList = [];

            // ネットワーク一覧を取得
            try
            {
                // FIXME エラー処理も不要になったのかなぁ。APIドキュメントにも反映されていないみたい。
                var networkInfo:NetworkInfo = NetworkInfo.networkInfo;
            }
            catch (e:Error)
            {
                logger.error("NetworkInterfaceManager::getNetworkInterfaceDataList new NetworkInfo Error {0}", e.message);
            }
            catch (e:SecurityError)
            {
                // TODO エラー処理
                // コンテンツを非アプリケーションサンドボックス内で実行させようとしたときに発生します
                logger.error("NetworkInterfaceManager::getNetworkInterfaceDataList new NetworkInfo SecurityError {0}", e.message);
            }

            var networkInterfaceList:Vector.<NetworkInterface> = networkInfo.findInterfaces();

            for each (var networkInterface:NetworkInterface in networkInterfaceList)
            {
                if (networkInterface.active)
                {

                    // アドレス一覧を取得
                    var addressList:Vector.<InterfaceAddress> = networkInterface.addresses;
                    for each (var address:InterfaceAddress in addressList)
                    {

                        // 簡易正規表現(IPv4アドレスかどうか)
                        var pattern:RegExp = /^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/;
                        if (pattern.test(address.address) && address.address != "127.0.0.1") // if(address.ipVersion == "IPv4")
                        {
                            var name:String = networkInterface.name;
                            if (networkInterface.displayName)
                            {
                                name = networkInterface.displayName;
                            }

                            try
                            {
                                var data:NetworkInterfaceData = new NetworkInterfaceData(name, address.address, address.prefixLength, address.broadcast);
                                this.networkDataList.push(data);
                            }
                            catch (e:Error)
                            {
                                // TODO エラー処理
                                // throw new NetworkInterfaceError(NetworkInterfaceError.NETWORK_MASK_ERROR);
                                logger.warn("Network mask error {0}", e.message);
                            }
                        }
                    }
                }
            }
            return this.networkDataList;
        }
    }
}

